iT邦幫忙

2024 iThome 鐵人賽

DAY 26
0

昨天提到想做彈窗,不過我們沒有使用 PrimeNG,
所以得自己實現彈窗元件。
首先,我們需要建立一個 DialogService 來集中管理彈窗的狀態。
這個服務將負責控制彈窗的開啟與關閉,
並讓其他組件能夠訂閱彈窗的可見性狀態。

import { Injectable } from '@angular/core';
import { Subject } from 'rxjs';

@Injectable({
    providedIn: 'root'
})
export class DialogService
{
    private dialogVisibility = new Subject<boolean>(); // 管理彈窗可見性的Subject
    dialogVisibility$ = this.dialogVisibility.asObservable(); // 讓其他組件訂閱可見性狀態

    openDialog()
    {
        this.dialogVisibility.next(true); // 打開彈窗
    }

    closeDialog()
    {
        this.dialogVisibility.next(false); // 關閉彈窗
    }
}

接著,我們需要新建 dialog.component 來作為彈窗的視圖和邏輯。
這個元件將接收 DialogService 的狀態變化,
並根據狀態顯示或隱藏彈窗。

// dialog.component.html
<div class="modal" *ngIf="isVisible">
  <div class="modal-content">
    <span class="close-button" (click)="close()">&times;</span>
    <ng-content></ng-content>
    <!-- 可插入的自定義內容 -->
  </div>
</div>
// dialog.component.ts
import { Component, OnInit } from '@angular/core';
import { DialogService } from 'src/app/shared/service/dialog.service';

@Component({
    selector: 'app-dialog',
    templateUrl: './dialog.component.html',
    styleUrls: ['./dialog.component.scss']
})
export class DialogComponent implements OnInit
{

    isVisible: boolean = false; // 本地的彈窗狀態

    constructor(private dialogService: DialogService) { }

    ngOnInit(): void
    {
        // 訂閱服務的可見性狀態變更
        this.dialogService.dialogVisibility$.subscribe(isVisible =>
        {
            this.isVisible = isVisible;
        });
    }

    close()
    {
        this.dialogService.closeDialog(); // 調用服務關閉彈窗
    }
}

在 element.module.ts 中,
記得將 DialogComponent 加到 exports 中,
這樣可以在其他模組中使用這個元件。

接下來,我們在 main.component 中測試彈窗。
將彈窗的模板放在 app.component 之下,
並且透過按鈕來控制彈窗的顯示與隱藏。
我們使用 DialogService 來管理彈窗的狀態,
因此可以在按鈕中調用 openDialog() 來打開彈窗。

// main.component.html

<div class="container" *ngIf="pageSettings">
  <app-form-input [pageSetting]="pageSettings[page]"> </app-form-input>
  <button (click)="pagePrev()">上一頁</button>
  <button (click)="pageNext()">下一頁</button>
  <button (click)="open()">彈窗</button>
</div>

// main.component.ts
    open()
    {
        this.dialogService.openDialog();
    }

這樣彈窗的元件雛型就完成了,
接下來我們可以進一步調整彈窗的內容和邏輯,
以符合我們的 list 邏輯需求。
今日程式:day26


上一篇
第25天 列表編輯模式
下一篇
第27天 列表彈窗
系列文
簡單的事 最困難-Angular動態Form元件30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言